/**
 * 2024.04.15 23:19 晴 毁我三观 让我 以代码 为武器 挥扫四方！ 太寒心了 吕游啊！
 */
import { toStringTypeCheck } from '../../../../components/aaanewApp/global/global';

const groupfuncName = 'name';

const groupfuncArguments = 'arguments';

const groupfuncBody = 'funcBody';

const groupfuncReturn = 'funcReturn';

const RegFunc =
  /function (?<name>\w*?)\((?<arguments>.*?)\) \{(?<funcBody>[^]*)\}/;
const RegReturn = /return (?<funcReturn>[^;]*);/g;

/**
 * 根据 传入函数 解构该函数 返回: 函数名、 期望参数、 函数体 及 返回值信息
 * @param {Function|String} funcStr function function.toString()
 */
function funcAsync(funcStr) {
  if (toStringTypeCheck(funcStr, 'function')) {
    funcStr = funcStr.toString();
  }
  let returninf = {
    name: new String(),
    funcArg: new Array(),
    funcBody: new String(),
    funcReturn: new String(),
  };

  let execFunc = RegFunc.exec(funcStr);

  let execReturnArr = [];
  let execReturn;
  while ((execReturn = RegReturn.exec(funcStr)) !== null) {
    execReturnArr.push(execReturn.groups[groupfuncReturn]);
    // console.log(execReturn.groups[groupfuncReturn]);
  }

  //   console.log(execFunc, execReturn);

  returninf.name = execFunc.groups[groupfuncName];
  returninf.funcArg = execFunc.groups[groupfuncArguments].split(',');
  returninf.funcArg.forEach((val, key, arr) => {
    arr[key] = val.trim();
  });
  returninf.funcBody = execFunc.groups[groupfuncBody];
  returninf.funcReturn = asyncReturnName(
    execReturnArr,
    execFunc.groups[groupfuncName]
  );

  return returninf;
}

/**
 * 根据 返回的 类型 进行 名称判定
 * @param {Array} arr 返回值 的 数组集
 * @param {String} funcName 函数名称 --前缀
 * @returns {string} funcName.[return,object,array,objName]
 */
function asyncReturnName(arr, funcName) {
  if (arr.length == 0) {
    return funcName + '.return';
  }
  let lastValue = arr[0];
  //   检测 数组 是否相同
  for (let i = 1; i < arr.length; i++) {
    if (lastValue != arr[i]) {
      return funcName + '.return';
    }
  }
  //   是个对象
  if (lastValue[0] == '{') {
    return funcName + '.object';
  } else if (lastValue[0] == '[') {
    return funcName + '.array';
  } else {
    return funcName + '.' + lastValue;
  }
}
// console.log(funcAsync(asyncReturnName.toString()));
export { funcAsync };
